﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "CollaborationCacheInterface.h"
#include "IObject.h"

namespace gcmp
{
    /// \brief 构件级协同，Element版本号本地缓存管理
    class COLLABORATION_CACHE_INTERFACE_EXPORT IElementVersionManager : public IObject
    {
        DEFINE_CAST_DERIVED(IElementVersionManager, IObject)
    public:         
        /// \brief 向缓存中设置Element版本号
        ///
        /// 不存在添加，存在用新值覆盖
        ///
        /// \param elementId 需要设置版本的ElementId
        /// \param version Element版本号
        /// \return void
        virtual void Set(const ElementId& elementId, Int32 version) = 0;

        /// \brief 向缓存中批量设置Element版本号
        ///
        /// 不存在添加，存在用新值覆盖
        ///
        /// \param elementsVersion 需要设置版本的ElementIds及对应版本号
        /// \return void
        virtual void Set(const std::unordered_map<ElementId, Int32, ElementIdHash>& elementsVersion) = 0;

        /// \brief 根据ElementId删除缓存中的版本号
        ///
        /// \param elementId 需要删除版本号的ElementId
        /// \return void
        virtual void Delete(const ElementId& elementId) = 0;

        /// \brief 根据ElementIds批量删除缓存中Element版本号
        ///
        /// \param elementIds 需要删除版本号的批量ElementId
        /// \return void
        virtual void Delete(const std::vector<ElementId>& elementIds) = 0;

        /// \brief 根据ElementId获取缓存中的版本号
        ///
        /// \param elementId 需要获取版本号的ElementId
        /// \return Int32 获取的版本号,ElementId不在缓存中，返回-1
        virtual Int32 Get(const ElementId& elementId) const = 0;

        /// \brief 根据ElementId批量获取缓存中的版本号
        ///
        /// \param elementIds[int] 需要获取版本号的批量ElementId
        /// \param std::unordered_map<ElementId, Int32, ElementIdHash>[out] 批量获取的ElementId及对应版本号
        /// \return void 
        virtual void Get(const std::vector<ElementId>& elementIds, std::unordered_map<ElementId, Int32, ElementIdHash>& elementsVersion) const = 0;

        /// \brief 根据ElementId批量获取缓存中的版本号
        ///
        /// \param elementIds 需要获取版本号的批量ElementId
        /// \return std::unordered_map<ElementId, Int32, ElementIdHash> 批量获取的ElementId及对应版本号
        virtual const std::unordered_map<ElementId, Int32, ElementIdHash> Get(const std::vector<ElementId>& elementIds) const = 0;

        /// \brief 获取缓存中所有Element版本号
        ///
        /// \return std::unordered_map<ElementId, Int32, ElementIdHash> 缓存中所有Elementid及对应的版本号
        virtual std::unordered_map<ElementId, Int32, ElementIdHash>& GetAll() = 0;

        /// \brief 获取缓存中所有Element版本号
        ///
        /// \return std::unordered_map<ElementId, Int32, ElementIdHash> 缓存中所有Elementid及对应的版本号
        virtual const std::unordered_map<ElementId, Int32, ElementIdHash>& GetAll() const = 0;

        /// \brief 从缓存中清理所有Element的版本
        ///
        /// \return void
        virtual void Clear() = 0;
    };
}
